/**
 * 静态属性和静态方法
 * 1. 静态属性指的是 Class 本身的属性，即Class.propName，而不是定义在实例对象（this）上的属性。
 * 2. 静态属性只能使用类名直接调用
 * 3. 静态方法只能使用类名直接调用
 * 4. 普通方法中的this 指向的是调用它的对象，静态方法包含this关键字，这个this指的是类，而不是实例
 * 5. 静态方法内部用this调用的方法是静态方法，用this调用的属性是静态属性
 * 6. 类名调用的是静态属性和方法，实例对象调用的是普通属性和方法
 */

// 静态属性
class Foo {
  static prop = 1
}

let foo = new Foo()
console.log(foo.prop);  // undefined
console.log(Foo.prop);   // 1

// 静态方法
class Fooo {
  static say() {
    console.log('静态方法：say');
  }
}

let fooo = new Fooo()
// fooo.say();  ❌
Fooo.say()      // 静态方法：say

// 注意事项
// 1. 普通方法中的this 指向的是调用它的对象
class Fn {
  static name = '静态属性name'
  static bar() {
    Fn.baz()
  }
  static baz() {
    console.log('静态方法baz');
  }
  baz() {
    console.log('普通方法baz');
  }
  bar() {
    this.baz()
    console.log('普通方法bar');
  }
}

let fn = new Fn()
fn.bar()  // 普通方法baz 普通方法bar  

// 2. 静态方法包含this关键字，这个this指的是类，而不是实例
class Fn2 {
  static bar() {
    this.baz()
  }
  static baz() {
    console.log('静态方法baz');
  }
  baz() {
    console.log('普通方法baz');
  }
}
// 静态方法bar调用了this.baz，这里的this指的是Foo类，而不是Foo的实例,所以调用的是静态方法baz
Fn2.bar() // 静态方法baz

// 3. 普通方法中调用静态属性和方法直接使用类名即可
class Fn3 {
  static name = '静态属性name'
  static bar() {
    this.baz()
  }
  static baz() {
    console.log('静态方法baz');
  }
  baz() {
    console.log('普通方法baz');
    Fn3.baz()
    console.log(Fn3.name);
  }
}

Fn3.baz() // 静态方法baz 
let fn3 = new Fn3()
fn3.baz() // 普通方法baz 静态方法baz 静态属性name